#include <stdio.h>

void preto (int lin, int col) 

void libera_matriz (Matriz** matriz) {
	
	Matriz* aponta;

	if(*matriz == NULL)
		return;

	if ((*matriz)->prox_abaixo->lin != -1)//caminha pra baixo enquanto nao apontar pro super cabeca
		libera_matriz ((*matriz)->prox_abaixo);

	if ((*matriz)->prox_direita->col != -1)//caminha pra direita(...)
		libera_matriz ((*matriz)->prox_direita);

	if ((*matriz)->prox_abaixo != *matriz){
 		aponta = *matriz;
		while (aponta->prox_abaixo != *matriz)
			aponta = aponta->prox_abaixo;

		aponta->prox_abaixo = *matriz->prox_abaixo;
	}
	 
	if ((*matriz)->prox_direita != *matriz){
		aponta = *matriz;
		while (aponta->prox_direita != *matriz)
			aponta = aponta->prox_direita;

		aponta->prox_direita = *matriz->prox_direita;
	}

	free (*matriz);	
		
}

void libera_pilha (Pilha** pilha) {

	Pilha* aponta;

	if (*pilha == NULL)
	  return;

	while ((*pilha)->prox != NULL) {
	aponta = (*pilha)->prox;
	free (*pilha);
	*pilha = aponta;
	}
	
	free (*pilha);
	aponta->prox = NULL;
}

void encerrar_jogo (Matriz** matriz, int tamanho_matriz, Pilha** pilha) {
	
	libera_matriz(matriz);
	libera_pilha(pilha);
	
	}

int iniciar_jogo () { //TODO: falta o resolvedor, de fato!

	int tamanho_matriz, i;
	int obstaculos, lin, col, ilin, icol; //ilin = posicao inicial 
	char tipo, subtipo, cima, baixo, direito, esquerdo;

	inicializa_pilha (&pilha);	
	inicializa_matriz (&matriz, tamanho_matriz);

	printf("Digite o tamanho da matriz e quantos elementos!\n");
	scanf("%d%d%d%d", &obstaculos, &tamanho_matriz, &ilin, &ilin);
	
	for (i=0;i<obstaculos;i++){
		printf("Linha e coluna dos caras!"); 
		scanf("%d%d",&lin,&col);
		insere_no (&matriz, tamanho_matriz, lin, col);
	}	
	

//	imprimir_matriz (matriz);
	return 0;
}

int resolve (Matriz** matriz, Pilha** pilha, int lin, int col, char direcao) {
	//resolvedor
	
	Matriz obstaculo;
	int novajogada[2];

	if (jogo_acabou) //TODO implementar
	  return 1;
	
	if(direcao == '-' || direcao == 'N'){
		if (obstaculo = acha_N(*matriz, lin, col)) { //TODO enxugar num FOR
			novajogada = calcula_jogada (lin, col, obstaculo);
			if (!(novajogada[0] == lin && novajogada[1] == col)
					&& !mov_repetido(*pilha, lin, col, novajogada[0], novajogada[1])){
				empilha (pilha,lin,col,'N');	
				if (resolve (matriz, pilha, novajogada[0], novajogada[1], obstaculo->baixo))
					return 1;
				desempilha (pilha);
				
			}
		}
	}

	if(direcao == '-' || direcao == 'S'){
		if (obstaculo = acha_S(*matriz, lin, col)) { //TODO enxugar num FOR
			novajogada = calcula_jogada (lin, col, obstaculo);
			if (!(novajogada[0] == lin && novajogada[1] == col)
					&& !mov_repetido(*pilha, lin, col, novajogada[0], novajogada[1])){
				empilha (pilha,lin,col,'S');			
				if (resolve (matriz, pilha, novajogada[0], novajogada[1], obstaculo->cima))
					return 1;
				desempilha (pilha);
			}
		}
	}

	if(direcao == '-' || direcao == 'O'){
		if (obstaculo = acha_O(*matriz, lin, col)) { //TODO enxugar num FOR
			novajogada = calcula_jogada (lin, col, obstaculo);
			if (!(novajogada[0] == lin && novajogada[1] == col)
					&& !mov_repetido(*pilha, lin, col, novajogada[0], novajogada[1])){
				empilha (pilha,lin,col,'O');			
				if (resolve (matriz, pilha, novajogada[0], novajogada[1], obstaculo->direita))
					return 1;
				desempilha (pilha);
			}
		}
	}

	if(direcao == '-' || direcao == 'L'){
		if (obstaculo = acha_L(*matriz, lin, col)) { //TODO enxugar num FOR
			novajogada = calcula_jogada (lin, col, obstaculo);
			if (!(novajogada[0] == lin && novajogada[1] == col)
					&& !mov_repetido(*pilha, lin, col, novajogada[0], novajogada[1])){
				empilha (pilha,lin,col,'L');			
				if (resolve (matriz, pilha, novajogada[0], novajogada[1], obstaculo->esquerda))
					return 1;
				desempilha (pilha);
			}
		}
	}

	return 0;	
}

int* calcula_jogada (int lin, int col, Matriz obstaculo) {

	int novapos[2];
	
	if (col == obstaculo->col){
		novapos[1] = col;
		if (lin > obstaculo->lin)
			novapos[0] = obstaculo->lin + 1; //indo para Norte
	    else 
			novapos[0] = obstaculo->lin - 1;
	}
	
	else if (lin == obstaculo->lin) {
		novapos[0] = lin;
		if (col > obstaculo->col)
			novapos[1] = obstaculo->col + 1; //indo para Oeste
		else
			novapos[1] = obstaculo->col - 1;
	}

	return novapos;
}
